var _ = require('lodash');
var path = require("path");
var orm = require("orm");
var dao = require(path.join(process.cwd(), "dao/DAO"));

var Promise = require("bluebird");
var uniqid = require('uniqid');

function doCheckOrderParams(params) {
    return new Promise(function(resolve, reject) {
        var info = {};
        if (params.order_id) info.order_id = params.order_id;

        if (!params.order_id) {
            if (!params.user_id) return reject("用户ID不能为空");
            if (isNaN(parseInt(params.user_id))) return reject("用户ID必须是数字");
            info.user_id = params.user_id;
        }

        if (!params.order_id) info.order_number = uniqid();

        if (!params.order_price) return reject("订单价格不能为空");
        if (isNaN(parseFloat(params.order_price))) return reject("订单价格必须为数字");
        info.order_price = params.order_price;

        if (params.order_pay) {
            info.order_pay = params.order_pay;
        } else {
            info.order_pay = '0';
        }
        if (params.is_send) {
            if (params.is_send == 1) {
                info.is_send = '是';
            } else {
                info.is_send = '否';
            }
        } else {
            info.is_send = '否';
        }

        if (params.trade_no) {
            info.trade_no = '否';
        } else {
            info.trade_no = '';
        }


        if (params.order_fapiao_title) {
            if (params.order_fapiao_title != '个人' && params.order_fapiao_title != '公司')
                return reject("发票抬头必须是 个人 或 公司");
            info.order_fapiao_title = params.order_fapiao_title;

        } else {
            info.order_fapiao_title = "个人";
        }

        if (params.order_fapiao_company) {
            info.order_fapiao_company = params.order_fapiao_company;
        } else {
            info.order_fapiao_company = "";
        }

        if (params.order_fapiao_content) {
            info.order_fapiao_content = params.order_fapiao_content;
        } else {
            info.order_fapiao_content = "";
        }

        if (params.consignee_addr) {
            info.consignee_addr = params.consignee_addr;
        } else {
            info.consignee_addr = "";
        }

        if (params.goods) {
            info.goods = params.goods;
        }

        info.pay_status = '0';
        if (params.order_id) info.create_time = (Date.parse(new Date()) / 1000);
        info.update_time = (Date.parse(new Date()) / 1000);

        resolve(info);
    });
}

function doCreateOrder(info) {
    return new Promise(function(resolve, reject) {
        dao.create("OrderModel", _.clone(info), function(err, newOrder) {
            if (err) return reject("创建订单失败");
            info.order = newOrder;
            resolve(info);
        });
    });
}

function doCreateOrderGood(orderGood) {
    return new Promise(function(resolve, reject) {
        dao.create("OrderGoodModel", orderGood, function(err, newOrderGood) {
            if (err) return reject("创建订单商品失败");
            resolve(newOrderGood);
        });
    });
}

function doAddOrderGoods(info) {

    return new Promise(function(resolve, reject) {

        if (!info.order) return reject("订单对象未创建");

        var orderGoods = info.goods;

        if (orderGoods && orderGoods.length > 0) {
            var fns = [];
            var goods_total_price = _.sum(_.map(orderGoods, "goods_price"));

            _(orderGoods).forEach(function(orderGood) {
                orderGood.order_id = info.order.order_id;
                orderGood.goods_total_price = goods_total_price;
                fns.push(doCreateOrderGood(orderGood));
            });
            Promise.all(fns)
                .then(function(results) {
                    info.order.goods = results;
                    resolve(info);
                })
                .catch(function(error) {
                    if (error) return reject(error);
                });

        } else {
            resolve(info);
        }
    });
}

function doGetAllOrderGoods(info) {
    return new Promise(function(resolve, reject) {
        if (!info.order) return reject("订单对象未创建");

        dao.list("OrderGoodModel", { "columns": { "order_id": info.order.order_id } }, function(err, orderGoods) {


            if (err) return reject("获取订单商品列表失败");

            info.order.goods = orderGoods;
            resolve(info);
        })
    });
}

function doGetOrder(info) {
    return new Promise(function(resolve, reject) {
        dao.show("OrderModel", info.order_id, function(err, newOrder) {

            if (err) return reject("获取订单详情失败");
            if (!newOrder) return reject("订单ID不能存在");
            info.order = newOrder;
            resolve(info);
        })
    });
}

function doUpdateOrder(info) {
    return new Promise(function(resolve, reject) {
        dao.update("OrderModel", info.order_id, _.clone(info), function(err, newOrder) {
            if (err) return reject("更新失败");
            info.order = newOrder;
            resolve(info);
        });

    });
}


module.exports.createOrder = function(params, cb) {
    doCheckOrderParams(params)
        .then(doCreateOrder)
        .then(doAddOrderGoods)
        .then(function(info) {
            cb(null, info.order);
        })
        .catch(function(err) {
            cb(err);
        });
}


module.exports.getAllOrders = function(params, cb) {
    var conditions = {};
    if (!params.pagenum || params.pagenum <= 0) return cb("pagenum 参数错误");
    if (!params.pagesize || params.pagesize <= 0) return cb("pagesize 参数错误");
    conditions["columns"] = {};
    if (params.user_id) {
        conditions["columns"]["user_id"] = params.user_id;
    }

    if (params.pay_status) {
        conditions["columns"]["pay_status"] = params.pay_status;
    }

    if (params.is_send) {
        if (params.is_send == 1) {
            conditions["columns"]["is_send"] = '是';
        } else {
            conditions["columns"]["is_send"] = '否';
        }
    }

    if (params.order_fapiao_title) {
        if (params.order_fapiao_title == 1) {
            conditions["columns"]["order_fapiao_title"] = '个人';
        } else {
            conditions["columns"]["order_fapiao_title"] = '公司';
        }
    }

    if (params.order_fapiao_company) {
        conditions["columns"]["order_fapiao_company"] = orm.like("%" + params.order_fapiao_company + "%");
    }

    if (params.order_fapiao_content) {
        conditions["columns"]["order_fapiao_content"] = orm.like("%" + params.order_fapiao_content + "%");
    }

    if (params.consignee_addr) {
        conditions["columns"]["consignee_addr"] = orm.like("%" + params.consignee_addr + "%");
    }

    dao.countByConditions("OrderModel", conditions, function(err, count) {
        if (err) return cb(err);
        pagesize = params.pagesize;
        pagenum = params.pagenum;
        pageCount = Math.ceil(count / pagesize);
        offset = (pagenum - 1) * pagesize;
        if (offset >= count) {
            offset = count;
        }
        limit = pagesize;

        // 构建条件
        conditions["offset"] = offset;
        conditions["limit"] = limit;
        // conditions["only"] = 
        conditions["order"] = "-create_time";


        dao.list("OrderModel", conditions, function(err, orders) {
            if (err) return cb(err);
            var resultDta = {};
            resultDta["total"] = count;
            resultDta["pagenum"] = pagenum;
            resultDta["goods"] = _.map(orders, function(order) {
                return order; //_.omit(order,);
            });
            cb(err, resultDta);
        })
    });
}

module.exports.getOrder = function(orderId, cb) {
    if (!orderId) return cb("用户ID不能为空");
    if (isNaN(parseInt(orderId))) return cb("用户ID必须是数字");

    doGetOrder({ "order_id": orderId })
        .then(doGetAllOrderGoods)
        .then(function(info) {
            cb(null, info.order);
        })
        .catch(function(err) {
            cb(err);
        });

}

module.exports.updateOrder = function(orderId, params, cb) {
    if (!orderId) return cb("用户ID不能为空");
    if (isNaN(parseInt(orderId))) return cb("用户ID必须是数字");
    params["order_id"] = orderId;
    doCheckOrderParams(params)
        .then(doUpdateOrder)
        .then(doGetAllOrderGoods)
        .then(function(info) {
            cb(null, info.order);
        })
        .catch(function(err) {
            cb(err);
        });

}